/************************************************************
       (@_       
  _     ) \_______________________________________________
 (_)@8@8{}<_______________________________________________>
        )_/        
       (@
Liuxp
Website:        http://me.alipay.com/liuxp
Version：       2.3
File name：     Publish.cs
Author：        刘小平
Date：          ‎2012年‎11‎月‎07‎日，‏‎16:10:40
Description：   用于 设置/获取 当前生成文件夹的名称
History：       2014年9月25日 15:07:06 将 CleanFolder 单线程-清除今天以前的所有版本（清理桌面）方法搬过来
***********************************************************/
using System;
using System.IO;
using System.Net;
using System.Data;
using System.Threading;
using System.Collections.Generic;

namespace Publish.Services
{
    public class FolderService : Service
    {
        #region SQL Server CONVERT 日期转换及格式

        /*
         
        Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
        Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
        Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
        Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
        Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
        Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
        Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
        Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
        Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
        Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
        Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
        Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
        Select CONVERT(varchar(100), GETDATE(), 12): 060516
        Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
        Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
        Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
        Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
        Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
        Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
        Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
        Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
        Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
        Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
        Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
        Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
        Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
        Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
        Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
        Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
        Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
        Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
        Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
        Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
        Select CONVERT(varchar(100), GETDATE(), 112): 20060516
        Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
        Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
        Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
        Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
        Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
        Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
         
        */

        #endregion

        #region Fields

        //获取今天发布了几次（加1返回，作为版本号），同时获取数据库所在服务器时间
        public const String GetCountSql = "SELECT COUNT(0)+1,CONVERT(VARCHAR, GETDATE(), 112) FROM [master].[dbo].[Publish] WHERE CONVERT(VARCHAR, CreatedTime, 102) = CONVERT(VARCHAR, GETDATE(), 102)";
        //记录版本号信息
        public const String InsertSql = "INSERT [master].[dbo].[Publish](ProjectName,FolderName,[Type],Files,CreatorIPv4,CreatorHostName,CreatedTime)VALUES(N'{0}',N'{1}',{2},N'{3}',N'{4}',N'{5}',GETDATE())"; //0 项目名称 1 文件名 2 发布类型 3 发布文件 4 IPv4地址 5 机器名

        #endregion

        #region Publish Method

        /// <summary>
        /// 将传入的项目文件名称加上时间标记
        /// </summary>
        /// <returns></returns>
        public static String GetFolder()
        {
            var dataRow = sqlHelper.GetDataSet(GetCountSql);
            var count = "1";
            var dateTime = String.Empty;

            foreach (DataRow item in dataRow.Rows)//由于只有一行数据，所以这里就不做判断了。
            {
                count = item[0].ToString();
                dateTime = item[1].ToString();
            }

            return dateTime + "_" + count;
        }

        /// <summary>
        /// 创建文件夹用于存放最新一个版本
        /// </summary>
        /// <param name="projectName"></param>
        /// <returns></returns>
        public static String CreatedFolder(String projectName)
        {
            #region 自动命名的第一个版本（单机版）

            ////检查是第几次发布，然后给予相对应的命名，至于循环次数1000就桌面的文件来说 应该处于极限了。
            //for (var i = 1; i < 1000; i++)
            //{
            //    var desktopFolders = DesktopPath + "_" + i;
            //    var target = new DirectoryInfo(desktopFolders);

            //    if (target.Exists) continue;//文件存在继续寻找新的文件名

            //    //显示当前版本项目文件名名称
            //    SetControlText("Microsoft Visual Studio Web Publish(" + CurrentDate.ToString("yyyyMMdd") + "_" + i + ")", this);

            //    target.Create();//文件路径不存在（自动生成最新的文件夹名称）
            //    CopyDirectory(Path, desktopFolders);//开始复制
            //    break;
            //}

            #endregion

            #region 自动命名第二个版本（网络团队版）

            Publish.Versions = projectName + GetFolder();//记录当前版本号， 在完成后保存到数据库
            var desktopFolders = Publish.DesktopPath + Publish.Versions;//桌面地址加上 最新版本号
            var target = new DirectoryInfo(desktopFolders);

            //显示当前版本项目文件名名称
            //SetControlText("Microsoft Visual Studio Web Publish(" + Versions + ")", this);

            target.Create();//文件路径不存在（自动生成最新的文件夹名称）

            //CopyDirectory(Path, desktopFolders);//开始复制

            #endregion

            return desktopFolders;
        }

        /// <summary>
        /// 记录发布版本号信息
        /// </summary>
        /// <param name="folderName">文件夹名称/版本号名称</param>
        /// <param name="type">发布类型：1 完全发布，2 选择发布</param>
        public static void SaveFolder(String folderName, Int32 type)
        {
            SaveFolder(folderName, type, "All Files");
        }

        /// <summary>
        /// 记录发布版本号信息
        /// </summary>
        /// <param name="folderName">文件夹名称/版本号名称</param>
        /// <param name="type">发布类型：1 完全发布，2 选择发布</param>
        /// <param name="files">发布文件</param>
        public static void SaveFolder(String folderName, Int32 type, String files)
        {
            //记录版本号信息
            sqlHelper.ExecuteNonQuery(String.Format(InsertSql, Publish.ProjectName, folderName, type, files, Services.SystemService.GetLocalIpv4(), Dns.GetHostName()));
        }

        /// <summary>
        /// 清理空文件夹
        /// </summary>
        /// <param name="path"></param>
        public static void ClearEmptyFolder(String path)
        {
            try
            {
                var dis = new DirectoryInfo(path);
                var directoryInfo = dis.GetDirectories();

                if (directoryInfo.Length > 0)
                {
                    foreach (var di in directoryInfo)
                    {
                        ClearEmptyFolder(di.FullName);
                    }
                }

                if (dis.GetFiles("*", SearchOption.TopDirectoryOnly).Length + dis.GetDirectories("*", SearchOption.AllDirectories).Length == 0)
                {//删除空文件夹
                    dis.Delete();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        /// <summary>
        /// 单线程-清除今天以前的所有版本（清理桌面）
        /// </summary>
        /// <param name="projectPathList"></param>
        public static void CleanFolder(IEnumerable<Project> projectPathList)
        {
            Thread.Sleep(10000);//延时10秒后开始

            Publish.CurrentDate = DateTime.Now;//重新赋值，又可以管一天。

            foreach (var project in projectPathList)
            {
                var projName = project.Path.Substring(project.Path.LastIndexOf('\\') + 1);

                for (var i = 2; i <= 17; i++)//这里的2是为了往后面倒推时间
                {
                    var date = Publish.CurrentDate.AddDays(1 - i);//尝试清除前15天前的版本，时间从昨天开始算起

                    for (var j = 1; j < 50; j++)
                    {//尝试清除50个版本
                        var path = Publish.DesktopPath + projName + date.ToString("yyyyMMdd") + "_" + j;

                        FileService.DeleteToRecycleBin(path);//删除文件夹

                        //尝试清理rar压缩文件，如果文件存在
                        FileService.DeleteToRecycleBin(path + ".rar");
                        //尝试清理zip压缩文件，如果文件存在
                        FileService.DeleteToRecycleBin(path + ".zip");
                    }
                }
            }
        }

        #endregion
    }
}
